package net.freestu.sola.web.parser.Parse.PageUpdate;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.freestu.sola.web.parser.Parse.DataReader;
import net.freestu.sola.web.parser.Parse.DataWriter;
import net.freestu.sola.web.parser.Parse.Page;
import net.freestu.sola.web.parser.Parse.Globle.GlobleVarOfParseSystem;
import net.freestu.sola.web.util.FileManager;
import net.freestu.sola.web.util.TimeOperator;

/**
 * Message组成： attr(表示是ADD,DLETE) name(表示是哪个文件) path(临时文件的路径)
 * www.lib.cdut.edu.cn 有一个UpdateForward
 * @author 秋刀鱼的滋味
 */
public class UpdateForward {

	private int NumEveryUpdateXml=500;//需要进行自行配置。一个文件最多500个页面信息.
	private int numOfAdd=1;           //是add1.xml文件的编号
	private int numOfUpdate=1;
	private int numOfDelete=1;
	
	
	//这里还需要将这个地方的xml文件进行切割。
	private ArrayList xmlfiles;// 装的是许多的XML文件(File).
	private File linkmd5;// 是一个文件,格式如下（link\\md5).
	private Map link2md5;// 将url-->md5
	private File xmlfolder;// XmlFolder/www.lib.cdut.edu.cn文件夹
	/**
	 * 这里只接受装有XML文件的路径名和linkmd5文件。 读取xmlfolder里面的文件然后将其读入内存并处理进行转发
	 * xmlfiles: 是 xml文件的集合.
	 */
	public UpdateForward(ArrayList xmlfiles, File xmlfolder) {

		this.xmlfiles = xmlfiles;
		this.xmlfolder = xmlfolder;// xml文件夹.(xml Folder/www.lib.cdut.edu.cn/)
		this.linkmd5 = new File(xmlfolder, "OldLink2MD5");// 只取OldLink2MD5文件
		link2md5 = readToMap();// 读取page2hash文件
	}

	/**
	 * linkmd5读入到内存中
	 * @return
	 */
	private Map readToMap() {

		Map hashmap = new HashMap();
		if (!linkmd5.exists()) {
			return null;// 如果不存在该文件，说明是第一次。所以网页应该全部为Add.
		}
		try {
			FileReader fr = new FileReader(linkmd5);
			BufferedReader br = new BufferedReader(fr);
			String line;
			while (br.ready()) {
				line = br.readLine();// 读入了:http://www.sina.com\\vaveddve2dgve34vsv
				String[] str = line.split("\\\\", 2);// 这里应该有查异常。
				hashmap.put(str[0], str[1].substring(1));
			}
			br.close();
			fr.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		return hashmap;
	}

	private List addlist = new ArrayList();

	private List deletelist = new ArrayList();

	private List updatelist = new ArrayList();

	/**
	 * 将数据Map出去.
	 */
	public void mapData() {
		// 1.先从XML文件中取出对象串。
		// 2.历遍对象串。
		Iterator t = xmlfiles.iterator();// 是XML文件的迭代
		while (t.hasNext()) {

			File xmlfile = (File) t.next();
			DataReader de = new DataReader(xmlfile);
			ArrayList al = (ArrayList) de.getPageList();
			Iterator it = al.iterator();
			while (it.hasNext()) {

				Page p = (Page) it.next();
				String url = p.getUrl();
				String md5 = p.getPagehash();// 页面更新判断

				// 如果有URL,而且link2md5不为null
				if ((link2md5 != null) && link2md5.containsKey(url)) {

					String m = (String) link2md5.get(url);
					if (md5.equals(m)) {// 如果有相同的URLMD5删除。
						link2md5.remove(url);// 将记录删除。
						continue;
					} else {// 如果不相同。传递更新消息。
						
						link2md5.remove(url);// 将记录删除。
						updatelist.add(p);
						checkUpdate();
					}
				} else {// 没有Url则包装成add消息。
					addlist.add(p);
					checkAdd();
				}
			}

		}
		if (null == link2md5)// 如果为空或者是第一次，则退出该函数。
			return;
		if (link2md5.isEmpty())
			return;

		// -----------------最后包装成删除的Page------------------------------------
		Set urlset = link2md5.keySet();
		Iterator iter = urlset.iterator();
		int i = 1;
		String time = TimeOperator.getCurrTime();
		while (iter.hasNext()) {

			String url = (String) iter.next();
			String ii = String.valueOf(i);

			Page pp;
			pp = new Page(ii, "d", url, "d", "d", time, "d", "d", "d");
			deletelist.add(pp);
			i++;
		}
	}

	/**
	 * 将文件OldLink2MD5删除，同时将NewLinkMD5改名为OldLinkMD5
	 */
	public void end() {
      
		//清空所有addlist,deletelist,updatelist,输出全部
		createAddXml(addlist,numOfAdd);
		createUpdateXml(updatelist,numOfUpdate);
		createDeleteXml(deletelist,numOfDelete);
		
		//?这里什么意思?
		
		for(File f:xmlfolder.listFiles()){
			if(!f.getName().endsWith("Link2MD5")){
				f.delete();
			}
		}
		
		new File(xmlfolder, "OldLink2MD5").delete();//删除old.每次只留一个oldlink2md5文件
		FileManager.modifyFileName(xmlfolder, "NewLink2MD5", "OldLink2MD5");
		
	}


	/**
	 * 这个函数将XMl数据按照每300个页面进行分割
	 * n是第几个xml文件的编号.
	 */
	public void createAddXml(List pagelist,int n) {
		
		
		    String name =Thread.currentThread().getName() + "@ADD@";
			FileManager.buildPageXml(GlobleVarOfParseSystem.UPDATE_FOLDER
					+ File.separator+"ADD",name+n + ".xml");
			
			File xml = new File(GlobleVarOfParseSystem.UPDATE_FOLDER
					+ File.separator+"ADD",name + n + ".xml");
			DataWriter de = new DataWriter(xml);
			de.writePages(pagelist);
	}

	public void createDeleteXml(List pagelist,int n) {

		
		String name =Thread.currentThread().getName() + "@DELETE@";
		FileManager.buildPageXml(GlobleVarOfParseSystem.UPDATE_FOLDER
				+ File.separator+"DELETE",name+n + ".xml");

		File xml = new File(GlobleVarOfParseSystem.UPDATE_FOLDER
				+ File.separator+"DELETE",name + n + ".xml");
		DataWriter de = new DataWriter(xml);
		
		de.writePages(pagelist);
	}

	public void createUpdateXml(List pagelist,int n) {

		String name =Thread.currentThread().getName() + "@UPDATE@";
		FileManager.buildPageXml(GlobleVarOfParseSystem.UPDATE_FOLDER
				+File.separator+"UPDATE",name+ n + ".xml");
		File xml = new File(GlobleVarOfParseSystem.UPDATE_FOLDER
				+File.separator+"UPDATE",name + n + ".xml");
		DataWriter de = new DataWriter(xml);
		de.writePages(pagelist);
	}
	
	public void checkAdd(){
		
		if(addlist.size()==NumEveryUpdateXml){
			createAddXml(addlist,numOfAdd);
			numOfAdd++;//xml文件编号++
			addlist.clear();
		}
	}
	
	public void checkUpdate(){
		
		if(updatelist.size()==NumEveryUpdateXml){
			createAddXml(updatelist,numOfAdd);
			numOfUpdate++;//xml文件编号++
			updatelist.clear();
		}
	}
}